﻿using System;
using System.Web.Mvc;

using Flagwind.Diagnostics;

namespace Flagwind.Web.Filters
{
	/// <summary>
	/// 表示一个特性，该特性用于处理由操作方法引发的异常。
	/// </summary>
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
	public class HandleExceptionFilter : FilterAttribute, IExceptionFilter
	{
		/// <summary>
		/// 在发生异常时调用。
		/// </summary>
		/// <param name="filterContext">操作筛选器上下文。</param>
		public void OnException(ExceptionContext filterContext)
		{
			if(filterContext == null)
				throw new ArgumentNullException(nameof(filterContext));

			if(filterContext.ExceptionHandled)
				return;

			//获取异常实例。
			var exception = filterContext.Exception;

			//转交异常处理管道处理。
			filterContext.ExceptionHandled = ExceptionHandlerManager.Instance.Handle(exception, filterContext);
		}
	}
}